{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "# 自动驾驶 AirSimNH\n",
    "\n",
    "注意：AirSim v1.2.2 版本已经将 AirSimNH.zip 重命名为 Neighborhood.zip 。\n",
    "\n",
    "请先运行 AirSimNH，再运行本文件。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import time\n",
    "import datetime as dt\n",
    "import math\n",
    "import itertools\n",
    "\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import tensorflow as tf\n",
    "from tensorflow import keras\n",
    "from tensorflow.keras.initializers import RandomNormal\n",
    "import msgpackrpc\n",
    "import airsim"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 环境"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "class AirSimCarEnv:\n",
    "    def __init__(self):\n",
    "        self.connect()\n",
    "    \n",
    "    \n",
    "    def connect(self):\n",
    "        # 连接正在运行的 AirSim\n",
    "        self.car_client = airsim.CarClient()\n",
    "        self.car_client.confirmConnection()\n",
    "        self.car_client.enableApiControl(True)\n",
    "        \n",
    "        \n",
    "    def get_image(self):\n",
    "        # 获得图像信息\n",
    "        while True: # 有的时候会失败，这时候重试就好\n",
    "            try:\n",
    "                image_request = airsim.ImageRequest(0, \n",
    "                        airsim.ImageType.Scene, False, False)\n",
    "                image_response = self.car_client.simGetImages(\n",
    "                        [image_request,])[0]\n",
    "                image1d = np.frombuffer(image_response.image_data_uint8,\n",
    "                        dtype=np.uint8)\n",
    "                image_rgba = image1d.reshape(image_response.height,\n",
    "                        image_response.width, -1)\n",
    "                break\n",
    "            except:\n",
    "                print('获取图像失败，重试')\n",
    "        return image_rgba[76:135,0:255,0:3].astype(float)\n",
    "    \n",
    "    \n",
    "    def control(self, throttle=0, steering=0, brake=0, handbrake=False):\n",
    "        # 设置油门、方向和刹车\n",
    "        car_controls = airsim.CarControls(throttle=throttle,\n",
    "                steering=steering, brake=brake, handbrake=handbrake)\n",
    "        self.car_client.setCarControls(car_controls)\n",
    "        \n",
    "        \n",
    "    def get_car_state(self):\n",
    "        # 获取车辆状态（速度等）\n",
    "        return self.car_client.getCarState()\n",
    "    \n",
    "    \n",
    "    def get_roads(self, include_corners=True):\n",
    "        # 获得地图上的路的信息\n",
    "        lines = [\n",
    "                [[-128, -121], [-128, 119]],\n",
    "                [[-120, -129], [120, -129]],\n",
    "                [[-120, 127], [120, 127]],\n",
    "                [[128, -121], [128, 119]],\n",
    "                [[0, -121], [0, 119]],\n",
    "                [[-120, 0], [120, 0]],\n",
    "                [[80, -124], [80, -5]],\n",
    "                ]\n",
    "        if include_corners: # 路的拐弯\n",
    "            for x0, x1 in [[-128, -120], [0, -8], [0, 8], [120, 128]]:\n",
    "                corners = [\n",
    "                        [[x0, -121], [x1, -129]],\n",
    "                        [[x0, -8], [x1, 0]],\n",
    "                        [[x0, 8], [x1, 0]],\n",
    "                        [[x0, 119], [x1, 127]],\n",
    "                        ]\n",
    "                lines += corners\n",
    "            for x0, x1 in [[80, 75], [80, 85]]:\n",
    "                corners = [\n",
    "                        [[x0, -124], [x1, -129]],\n",
    "                        [[x0, -5], [x1, 0]],\n",
    "                        ]\n",
    "                lines += corners\n",
    "        roads = [(np.array(p), np.array(q)) for p, q in lines]\n",
    "        return roads\n",
    "\n",
    "    \n",
    "    def get_start_pose(self, random=True, verbose=True):\n",
    "        # 在路上选择一个起始位置和方向\n",
    "        if not random: # 固定选择默认的起始位置\n",
    "            position = np.array([0., 0.])\n",
    "            yaw = 0.\n",
    "        else: # 随机选择一个位置\n",
    "            if not hasattr(self, 'roads_without_corners'):\n",
    "                self.roads_without_corners = self.get_roads(\n",
    "                        include_corners=False)\n",
    "\n",
    "            # 计算位置\n",
    "            road_index = np.random.choice(len(self.roads_without_corners))\n",
    "            p, q = self.roads_without_corners[road_index]\n",
    "            t = np.random.uniform(0.3, 0.7)\n",
    "            position = t * p + (1. - t) * q\n",
    "\n",
    "            # 计算朝向\n",
    "            if np.isclose(p[0], q[0]): # 与 Y 轴平行\n",
    "                yaws = [0.5 * math.pi, -0.5 * math.pi]\n",
    "            elif np.isclose(p[1], q[1]): # 与 X 轴平行\n",
    "                yaws = [0., math.pi]\n",
    "            yaw = np.random.choice(yaws)\n",
    "        \n",
    "        if verbose:\n",
    "            print('起始位置 = {}, 方向 = {}'.format(position, yaw))\n",
    "\n",
    "        position = airsim.Vector3r(position[0], position[1], -0.6)\n",
    "        orientation = airsim.to_quaternion(pitch=0., roll=0., yaw=yaw)\n",
    "        pose = airsim.Pose(position, orientation)\n",
    "        return pose\n",
    "    \n",
    "    \n",
    "    def reset(self, explore_start=False, brake_confirm=True,\n",
    "            start_accelerate=True, max_epoch_time=None, verbose=True):\n",
    "        if verbose:\n",
    "            print('开始新回合')\n",
    "\n",
    "        # 起始探索\n",
    "        start_pose = self.get_start_pose(random=explore_start)\n",
    "\n",
    "        if brake_confirm:\n",
    "            # 预设值起始位置, 刹车，并等待车变的稳定\n",
    "            # 因为 simSetVehiclePose() 不能设置速度，只能选择刹车再等待\n",
    "            self.car_client.simSetVehiclePose(start_pose, True)\n",
    "            env.control(brake=1, handbrake=True)\n",
    "            time.sleep(4)\n",
    "\n",
    "        # 再次设置初始位置\n",
    "        if verbose:\n",
    "            print('设置初始位置')\n",
    "        self.car_client.simSetVehiclePose(start_pose, True)\n",
    "\n",
    "        if start_accelerate:\n",
    "            # 让车加速一段时间，否则如果车的速度太小，后面会认为回合结束\n",
    "            if verbose:\n",
    "                print('直行一段时间')\n",
    "            env.control(throttle=1)\n",
    "            time.sleep(4)\n",
    "            \n",
    "        # 回合开始时间和预期结束时间\n",
    "        self.start_time = dt.datetime.now()\n",
    "        self.end_time = None\n",
    "        if max_epoch_time:\n",
    "            self.expected_end_time = self.start_time + \\\n",
    "                    dt.timedelta(seconds=max_epoch_time)\n",
    "        else:\n",
    "            self.expected_end_time = None\n",
    "\n",
    "    \n",
    "    def get_reward(self):\n",
    "        # 计算奖励，并评估回合是否结束\n",
    "        \n",
    "        collision_info = self.car_client.simGetCollisionInfo() # 碰撞信息\n",
    "        if collision_info.has_collided: # 如果撞车了，没有奖励，回合结束\n",
    "            self.end_time = dt.datetime.now()\n",
    "            return 0.0, True, {'message' : 'collided'}\n",
    "        \n",
    "        car_state = self.car_client.getCarState() # 获取车辆速度信息\n",
    "        if car_state.speed < 2: # 如果停车了，没有奖励，回合结束\n",
    "            self.end_time = dt.datetime.now()\n",
    "            return 0.0, True, {'speed' : car_state.speed}\n",
    "        \n",
    "        car_point = car_state.kinematics_estimated.position. \\\n",
    "                to_numpy_array() # 获取车辆位置信息\n",
    "\n",
    "        if not hasattr(self, 'roads'):\n",
    "            self.roads = self.get_roads()\n",
    "        \n",
    "        # 计算位置到各条路的最小距离\n",
    "        distance = float('+inf')\n",
    "        for p, q in self.roads:\n",
    "            # 点到线段的最小距离\n",
    "            frac = np.dot(car_point[:2] - p, q - p) / np.dot(q - p, q - p)\n",
    "            clipped_frac = np.clip(frac, 0., 1.)\n",
    "            closest = p + clipped_frac * (q - p)\n",
    "            dist = np.linalg.norm(car_point[:2] - closest)\n",
    "            distance = min(dist, distance) # 更新最小距离\n",
    "            \n",
    "        reward = math.exp(-1.2 * distance) # 基于距离的奖励函数\n",
    "        \n",
    "        if distance > 3.5: # 偏离路面太远，回合结束\n",
    "            self.end_time = dt.datetime.now()\n",
    "            return reward, True, {'distance' : distance}\n",
    "        \n",
    "        # 判断是否超时\n",
    "        now = dt.datetime.now()\n",
    "        if self.expected_end_time is not None and now > \\\n",
    "                self.expected_end_time:\n",
    "            self.end_time = now\n",
    "            info = {'start_time' : self.start_time,\n",
    "                    'end_time' : self.end_time}\n",
    "            return reward, True, info # 回合超时结束\n",
    "        \n",
    "        return reward, False, {}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 智能体\n",
    "经验回放"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "class DQNReplayer:\n",
    "    def __init__(self, capacity):\n",
    "        self.memory = pd.DataFrame(index=range(capacity),\n",
    "                columns=['observation', 'action', 'reward',\n",
    "                'next_observation', 'done'])\n",
    "        self.i = 0\n",
    "        self.count = 0\n",
    "        self.capacity = capacity\n",
    "    \n",
    "    def store(self, *args):\n",
    "        self.memory.loc[self.i] = args\n",
    "        self.i = (self.i + 1) % self.capacity\n",
    "        self.count = min(self.count + 1, self.capacity)\n",
    "        \n",
    "    def sample(self, size):\n",
    "        indices = np.random.choice(self.count, size=size)\n",
    "        return (np.stack(self.memory.loc[indices, field]) for field in \\\n",
    "                self.memory.columns)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "带目标网络的深度 Q 网络算法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "class DQNAgent():\n",
    "    def __init__(self, gamma=0.99, batch_size=32,\n",
    "            replayer_capacity=2000, random_inital_steps=50,\n",
    "            weight_path=None, train_conv=True,\n",
    "            epsilon=1., min_epsilon=0.1, epsilon_decrease_rate=0.003):\n",
    "        self.action_n = 5\n",
    "        self.gamma = gamma\n",
    "        \n",
    "        # 经验回放\n",
    "        self.replayer = DQNReplayer(capacity=replayer_capacity)\n",
    "        self.batch_size = batch_size\n",
    "        self.random_inital_steps = random_inital_steps\n",
    "        \n",
    "        # 探索参数\n",
    "        self.epsilon = epsilon\n",
    "        self.min_epsilon = min_epsilon\n",
    "        self.epsilon_decrease_rate = epsilon_decrease_rate\n",
    "        \n",
    "        # 搭建网络\n",
    "        self.evaluate_net = self.build_network(weight_path=weight_path,\n",
    "                train_conv=train_conv)\n",
    "        self.target_net = self.build_network()\n",
    "        self.target_net.set_weights(self.evaluate_net.get_weights())\n",
    "        \n",
    "    def build_network(self, activation='relu', weight_path=None, \n",
    "                train_conv=True, verbose=True):\n",
    "        inputs = keras.Input(shape=(59, 255, 3))\n",
    "        x = inputs\n",
    "        \n",
    "        # 卷积层\n",
    "        for filte in [16, 32, 32]:\n",
    "            z = keras.layers.Conv2D(filte, 3, padding='same',\n",
    "                    activation=activation,\n",
    "                    trainable=train_conv)(x)\n",
    "            x = keras.layers.MaxPooling2D(pool_size=2)(z)\n",
    "        \n",
    "        y = keras.layers.Flatten()(x)\n",
    "        \n",
    "        # 全连接层\n",
    "        x = keras.layers.Dropout(0.2)(y)\n",
    "        z = keras.layers.Dense(128, activation=tf.nn.relu,\n",
    "                kernel_initializer=RandomNormal(stddev=0.01))(x)\n",
    "        y = keras.layers.Dropout(0.2)(z)\n",
    "        outputs = keras.layers.Dense(self.action_n,\n",
    "                kernel_initializer=RandomNormal(stddev=0.01))(y)\n",
    "\n",
    "        net = keras.Model(inputs=inputs, outputs=outputs)\n",
    "        net.compile(optimizer='adam', loss='mse')\n",
    "        \n",
    "        if verbose:\n",
    "            net.summary()\n",
    "        \n",
    "        if weight_path:\n",
    "            net.load_weights(weight_path)\n",
    "            if verbose:\n",
    "                print('载入网络权重 {}'.format(weight_path))\n",
    "\n",
    "        return net\n",
    "        \n",
    "        \n",
    "    def decide(self, observation, random=False):\n",
    "        if random or np.random.rand() < self.epsilon:\n",
    "            return np.random.randint(self.action_n)\n",
    "        observations = observation[np.newaxis]\n",
    "        qs = self.evaluate_net.predict(observations)\n",
    "        return np.argmax(qs)\n",
    "\n",
    "    \n",
    "    def action2control(self, action, car_state):\n",
    "        # 将动作转换为控制信号\n",
    "        steering = 0.5 * action - 1. # 方向，可取 -1, -0.5, 0, 0.5, 1\n",
    "        if car_state.speed > 9:\n",
    "            return 0, steering, 1\n",
    "        else:\n",
    "            return 1, steering, 0\n",
    "\n",
    "    \n",
    "    def learn(self, observation, action, reward, next_observation, done):\n",
    "        agent.replayer.store(observation, action, reward, next_observation,\n",
    "                done) # 存储经验\n",
    "        \n",
    "        if self.replayer.count < self.random_inital_steps:\n",
    "            return # 还没到存足够多的经验，先不训练神经网络\n",
    "        \n",
    "        observations, actions, rewards, next_observations, dones = \\\n",
    "                self.replayer.sample(self.batch_size) # 经验回放\n",
    "\n",
    "        next_qs = self.target_net.predict(next_observations)\n",
    "        next_max_qs = next_qs.max(axis=-1)\n",
    "        us = rewards + self.gamma * next_max_qs * (1. - dones)\n",
    "        targets = self.evaluate_net.predict(observations)\n",
    "        targets[np.arange(us.shape[0]), actions] = us\n",
    "        self.evaluate_net.fit(observations, targets, verbose=0)\n",
    "        \n",
    "        if done:\n",
    "            self.target_net.set_weights(self.evaluate_net.get_weights())\n",
    "        \n",
    "        # 减小 epsilon 的值\n",
    "        self.epsilon -= self.epsilon_decrease_rate\n",
    "        self.epsilon = max(self.epsilon, self.min_epsilon)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 智能体与环境交互"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "def play_once(env, agent, explore_start=False, random=False, train=False,\n",
    "    max_epoch_time=None, wait_delta_sec=0.01, verbose=True):\n",
    "\n",
    "    # 启动新回合，在地图上选择一个地方，并让汽车前进一段\n",
    "    env.reset(explore_start=explore_start, max_epoch_time=max_epoch_time)\n",
    "    \n",
    "    # 正式开始学习\n",
    "    for step in itertools.count():\n",
    "\n",
    "        image = env.get_image()\n",
    "        car_state = env.get_car_state()\n",
    "        action = agent.decide(image, random=random)\n",
    "        \n",
    "        # 根据动作影响环境\n",
    "        throttle, steering, brake = agent.action2control(action, car_state)\n",
    "        if verbose:\n",
    "            print('动作 = {}, 速度 = {}, 油门 = {}, 方向 = {}, 刹车 = {}' \\\n",
    "                    .format(action, car_state.speed, throttle, steering,\n",
    "                    brake))\n",
    "        env.control(throttle, steering, brake)\n",
    "\n",
    "        # 等待一段时间\n",
    "        time.sleep(wait_delta_sec)\n",
    "\n",
    "        # 获得更新后的观测、奖励和回合结束指示\n",
    "        next_image = env.get_image()\n",
    "        reward, done, info = env.get_reward()\n",
    "\n",
    "        # 如果回合刚开始就结束了，就不是靠谱的回合\n",
    "        if step == 0 and done:\n",
    "            if verbose:\n",
    "                print('不成功的回合，放弃保存')\n",
    "            break\n",
    "        \n",
    "        if train: # 根据经验学习\n",
    "            agent.learn(image, action, reward, next_image, done)\n",
    "        \n",
    "        # 回合结束\n",
    "        if done:\n",
    "            if verbose:\n",
    "                print('回合 从 {} 到 {} 结束. {}'.format(\n",
    "                        env.start_time, env.end_time, info))\n",
    "            break"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 训练和测试"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "scrolled": true
   },
   "outputs": [],
   "source": [
    "\"\"\"\n",
    "从头开始训练，需要训练几周\n",
    "\"\"\"\n",
    "weight_path = None # 载入权重数据的位置\n",
    "train_conv = True # 是否训练卷积层\n",
    "max_epoch_time = 30. # 最长回合时间\n",
    "random_inital_steps = 1000 # 随机运行的初始步数\n",
    "train = True # 是否训练\n",
    "\n",
    "\"\"\"\n",
    "预训练的结果，只需要再训练全连接层，再训练数小时即可\n",
    "\"\"\"\n",
    "weight_path = 'pretrain_weights.h5'\n",
    "train_conv = False\n",
    "max_epoch_time = 30.\n",
    "random_inital_steps = 50\n",
    "train = True\n",
    "\n",
    "\"\"\"\n",
    "训练好的结果，直接能用\n",
    "\"\"\"\n",
    "weight_path = 'weights.h5'\n",
    "train_conv = False\n",
    "max_epoch_time = None\n",
    "random_inital_steps = 0\n",
    "train = False"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Connected!\n",
      "Client Ver:1 (Min Req: 1), Server Ver:1 (Min Req: 1)\n",
      "\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "input_1 (InputLayer)         (None, 59, 255, 3)        0         \n",
      "_________________________________________________________________\n",
      "conv2d (Conv2D)              (None, 59, 255, 16)       448       \n",
      "_________________________________________________________________\n",
      "max_pooling2d (MaxPooling2D) (None, 29, 127, 16)       0         \n",
      "_________________________________________________________________\n",
      "conv2d_1 (Conv2D)            (None, 29, 127, 32)       4640      \n",
      "_________________________________________________________________\n",
      "max_pooling2d_1 (MaxPooling2 (None, 14, 63, 32)        0         \n",
      "_________________________________________________________________\n",
      "conv2d_2 (Conv2D)            (None, 14, 63, 32)        9248      \n",
      "_________________________________________________________________\n",
      "max_pooling2d_2 (MaxPooling2 (None, 7, 31, 32)         0         \n",
      "_________________________________________________________________\n",
      "flatten (Flatten)            (None, 6944)              0         \n",
      "_________________________________________________________________\n",
      "dropout (Dropout)            (None, 6944)              0         \n",
      "_________________________________________________________________\n",
      "dense (Dense)                (None, 128)               888960    \n",
      "_________________________________________________________________\n",
      "dropout_1 (Dropout)          (None, 128)               0         \n",
      "_________________________________________________________________\n",
      "dense_1 (Dense)              (None, 5)                 645       \n",
      "=================================================================\n",
      "Total params: 903,941\n",
      "Trainable params: 889,605\n",
      "Non-trainable params: 14,336\n",
      "_________________________________________________________________\n",
      "载入网络权重 weights.h5\n",
      "开始测试\n",
      "开始新回合\n",
      "起始位置 = [0. 0.], 方向 = 0.0\n",
      "设置初始位置\n",
      "直行一段时间\n",
      "动作 = 3, 速度 = 3.1895177364349365, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 3.8471243381500244, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 4.3733649253845215, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 4.576972007751465, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 4.957728862762451, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 5.633646011352539, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.329768657684326, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.1464715003967285, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.820223808288574, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 8.458905220031738, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 9.062920570373535, 油门 = 0, 方向 = 0.5, 刹车 = 1\n",
      "动作 = 1, 速度 = 8.172916412353516, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.731364727020264, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.076422691345215, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 7.4023566246032715, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 7.802061557769775, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 8.252936363220215, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 8.187849998474121, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 8.901389122009277, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 9.536048889160156, 油门 = 0, 方向 = -0.5, 刹车 = 1\n",
      "动作 = 3, 速度 = 9.357033729553223, 油门 = 0, 方向 = 0.5, 刹车 = 1\n",
      "动作 = 3, 速度 = 8.092472076416016, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.893648147583008, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.658308029174805, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.26226806640625, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.016329288482666, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.062537670135498, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.070157527923584, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.417018413543701, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 7.198077201843262, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 7.880393981933594, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 8.551234245300293, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 9.21201229095459, 油门 = 0, 方向 = -0.5, 刹车 = 1\n",
      "动作 = 1, 速度 = 8.316672325134277, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.855922698974609, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 7.008326053619385, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.9334845542907715, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.134029388427734, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.519104480743408, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.481141090393066, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 8.147513389587402, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 8.613417625427246, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 9.307802200317383, 油门 = 0, 方向 = 0.5, 刹车 = 1\n",
      "动作 = 3, 速度 = 9.54430866241455, 油门 = 0, 方向 = 0.5, 刹车 = 1\n",
      "动作 = 1, 速度 = 8.557117462158203, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.745972633361816, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.696407794952393, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.272114276885986, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 5.952030658721924, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.2152628898620605, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.269509792327881, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.560122489929199, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.464717864990234, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 8.10866641998291, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 8.813241004943848, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 9.16175365447998, 油门 = 0, 方向 = 0.5, 刹车 = 1\n",
      "动作 = 1, 速度 = 9.209503173828125, 油门 = 0, 方向 = -0.5, 刹车 = 1\n",
      "动作 = 1, 速度 = 6.8118896484375, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 4.955815315246582, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 5.46082878112793, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 5.955422878265381, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.480515480041504, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.532522201538086, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.8548407554626465, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.443867206573486, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 8.149593353271484, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 8.739630699157715, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 9.39649486541748, 油门 = 0, 方向 = 0.5, 刹车 = 1\n",
      "动作 = 3, 速度 = 9.092202186584473, 油门 = 0, 方向 = 0.5, 刹车 = 1\n",
      "动作 = 3, 速度 = 6.668689250946045, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 4.858713150024414, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 5.029883861541748, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 5.739842414855957, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.267620086669922, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.501637935638428, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.616127967834473, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.358177185058594, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 7.905206203460693, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 8.707651138305664, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 9.186805725097656, 油门 = 0, 方向 = 0.5, 刹车 = 1\n",
      "动作 = 1, 速度 = 9.360838890075684, 油门 = 0, 方向 = -0.5, 刹车 = 1\n",
      "动作 = 1, 速度 = 7.3694376945495605, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 5.532800674438477, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 5.9460673332214355, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.322542190551758, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.762941837310791, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 7.112766742706299, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 7.13178014755249, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 7.8672003746032715, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 8.572874069213867, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 8.985904693603516, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 9.614696502685547, 油门 = 0, 方向 = 0.5, 刹车 = 1\n",
      "动作 = 3, 速度 = 9.89875602722168, 油门 = 0, 方向 = 0.5, 刹车 = 1\n",
      "动作 = 3, 速度 = 7.606907367706299, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 5.809663772583008, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 5.987547397613525, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.59527063369751, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.135079860687256, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 7.125704288482666, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 7.556676864624023, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 8.218000411987305, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 8.87338924407959, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 9.47683334350586, 油门 = 0, 方向 = 0.5, 刹车 = 1\n",
      "动作 = 3, 速度 = 9.51712703704834, 油门 = 0, 方向 = 0.5, 刹车 = 1\n",
      "动作 = 1, 速度 = 7.156889915466309, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 5.4012346267700195, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 5.511157512664795, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.189715385437012, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.4595513343811035, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.692070007324219, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.9615912437438965, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 7.675571918487549, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 8.293891906738281, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 8.964509963989258, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 9.583735466003418, 油门 = 0, 方向 = -0.5, 刹车 = 1\n",
      "动作 = 1, 速度 = 9.398954391479492, 油门 = 0, 方向 = -0.5, 刹车 = 1\n",
      "动作 = 1, 速度 = 7.371530532836914, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 5.346431255340576, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 5.766501426696777, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.182442665100098, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.646164894104004, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.988319396972656, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.033868789672852, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 7.910460472106934, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 8.574641227722168, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 9.214980125427246, 油门 = 0, 方向 = -0.5, 刹车 = 1\n",
      "动作 = 3, 速度 = 9.220431327819824, 油门 = 0, 方向 = 0.5, 刹车 = 1\n",
      "动作 = 3, 速度 = 6.874495506286621, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 4.817204475402832, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 5.34416389465332, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 5.630955696105957, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.120583534240723, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.678467273712158, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.481180667877197, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.360558986663818, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 8.061092376708984, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 8.756379127502441, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 9.303067207336426, 油门 = 0, 方向 = 0.5, 刹车 = 1\n",
      "动作 = 1, 速度 = 9.077926635742188, 油门 = 0, 方向 = -0.5, 刹车 = 1\n",
      "动作 = 1, 速度 = 6.67409086227417, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 4.8240742683410645, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 5.104003429412842, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 5.715356349945068, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.337867736816406, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.399961948394775, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.584537029266357, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.391052722930908, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 8.104546546936035, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 8.734485626220703, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 9.379907608032227, 油门 = 0, 方向 = 0.5, 刹车 = 1\n",
      "动作 = 3, 速度 = 9.334184646606445, 油门 = 0, 方向 = 0.5, 刹车 = 1\n",
      "动作 = 1, 速度 = 7.443093299865723, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 5.676989555358887, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 5.786962032318115, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.311604976654053, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.889692783355713, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.976900577545166, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 7.2784423828125, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 7.986571311950684, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 8.503625869750977, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 9.175052642822266, 油门 = 0, 方向 = -0.5, 刹车 = 1\n",
      "动作 = 1, 速度 = 9.373727798461914, 油门 = 0, 方向 = -0.5, 刹车 = 1\n",
      "动作 = 1, 速度 = 7.167681694030762, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 5.367587566375732, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 5.514154434204102, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 5.585204124450684, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 5.6974053382873535, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 5.840219974517822, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.382460594177246, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.010835647583008, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 7.5516557693481445, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 8.291065216064453, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 8.874775886535645, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 9.39359188079834, 油门 = 0, 方向 = 0.5, 刹车 = 1\n",
      "动作 = 3, 速度 = 9.583463668823242, 油门 = 0, 方向 = 0.5, 刹车 = 1\n",
      "动作 = 3, 速度 = 7.21088981628418, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 5.1880784034729, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 5.807282447814941, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.091342449188232, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.5254130363464355, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.805954933166504, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 7.075337886810303, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 7.720657825469971, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 8.310574531555176, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 8.858641624450684, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 9.507147789001465, 油门 = 0, 方向 = 0.5, 刹车 = 1\n",
      "动作 = 3, 速度 = 9.670866966247559, 油门 = 0, 方向 = 0.5, 刹车 = 1\n",
      "动作 = 3, 速度 = 7.2535529136657715, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 5.462585926055908, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 5.8733367919921875, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.073831081390381, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.388072967529297, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.691475868225098, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 7.008124828338623, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 7.565032005310059, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 8.368218421936035, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 8.785594940185547, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 9.3850736618042, 油门 = 0, 方向 = -0.5, 刹车 = 1\n",
      "动作 = 1, 速度 = 9.523093223571777, 油门 = 0, 方向 = -0.5, 刹车 = 1\n",
      "动作 = 3, 速度 = 7.516262054443359, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 5.528177261352539, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 5.9007568359375, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.153639793395996, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "获取图像失败，重试\n",
      "获取图像失败，重试\n",
      "获取图像失败，重试\n",
      "获取图像失败，重试\n",
      "获取图像失败，重试\n",
      "获取图像失败，重试\n",
      "动作 = 1, 速度 = 6.837223529815674, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.173300743103027, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.072721481323242, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 7.807687282562256, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 8.471075057983398, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 9.113402366638184, 油门 = 0, 方向 = 0.5, 刹车 = 1\n",
      "动作 = 3, 速度 = 9.162198066711426, 油门 = 0, 方向 = 0.5, 刹车 = 1\n",
      "动作 = 1, 速度 = 7.423996925354004, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 5.626120567321777, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 5.245078086853027, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 5.396946430206299, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 5.317490100860596, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 5.569572448730469, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 5.4927873611450195, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.289036273956299, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.92095947265625, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 7.544229984283447, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 8.323125839233398, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 9.019855499267578, 油门 = 0, 方向 = -0.5, 刹车 = 1\n",
      "动作 = 1, 速度 = 9.171649932861328, 油门 = 0, 方向 = -0.5, 刹车 = 1\n",
      "动作 = 1, 速度 = 7.161615371704102, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 5.375631809234619, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 5.610616207122803, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.136422157287598, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.726373672485352, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.987077713012695, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.3128662109375, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.819345474243164, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 8.335708618164062, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 8.839539527893066, 油门 = 1, 方向 = 0.5, 刹车 = 0\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "动作 = 3, 速度 = 9.51011848449707, 油门 = 0, 方向 = 0.5, 刹车 = 1\n",
      "动作 = 1, 速度 = 9.632548332214355, 油门 = 0, 方向 = -0.5, 刹车 = 1\n",
      "动作 = 1, 速度 = 7.487555503845215, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 5.64896297454834, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.015483856201172, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.38810920715332, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.433908462524414, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.3487162590026855, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.789121627807617, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.522523403167725, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 8.207453727722168, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 8.642502784729004, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 9.238177299499512, 油门 = 0, 方向 = 0.5, 刹车 = 1\n",
      "动作 = 3, 速度 = 9.441118240356445, 油门 = 0, 方向 = 0.5, 刹车 = 1\n",
      "动作 = 3, 速度 = 7.230255603790283, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 5.4302496910095215, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 5.594201564788818, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.038629055023193, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.707418441772461, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.879589557647705, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.958930969238281, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.723262310028076, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 8.338875770568848, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 8.973237991333008, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 9.623806953430176, 油门 = 0, 方向 = 0.5, 刹车 = 1\n",
      "动作 = 3, 速度 = 9.349783897399902, 油门 = 0, 方向 = 0.5, 刹车 = 1\n",
      "动作 = 1, 速度 = 6.922278881072998, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 5.138107776641846, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 5.4288153648376465, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 5.875878810882568, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.409930229187012, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.492436408996582, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.958558082580566, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.737909317016602, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 8.407976150512695, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 9.0108003616333, 油门 = 0, 方向 = -0.5, 刹车 = 1\n",
      "动作 = 1, 速度 = 8.782491683959961, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.938661575317383, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.982818603515625, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.9049506187438965, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.143311500549316, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 7.521313190460205, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 7.615588188171387, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 7.9812517166137695, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 8.685336112976074, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 9.429338455200195, 油门 = 0, 方向 = -0.5, 刹车 = 1\n",
      "动作 = 1, 速度 = 9.50162410736084, 油门 = 0, 方向 = -0.5, 刹车 = 1\n",
      "动作 = 3, 速度 = 8.20622444152832, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.348976135253906, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.258157253265381, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 5.892164707183838, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 5.8678789138793945, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.031269550323486, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 5.940471649169922, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.533030033111572, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.12703800201416, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.77987003326416, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 8.445539474487305, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 9.04281234741211, 油门 = 0, 方向 = 0.5, 刹车 = 1\n",
      "动作 = 3, 速度 = 8.794607162475586, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.957224369049072, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.0609130859375, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.040602207183838, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.203771591186523, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 7.530736923217773, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 7.684418678283691, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 8.148787498474121, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 8.84360408782959, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 9.537107467651367, 油门 = 0, 方向 = -0.5, 刹车 = 1\n",
      "动作 = 1, 速度 = 9.716938018798828, 油门 = 0, 方向 = -0.5, 刹车 = 1\n",
      "动作 = 3, 速度 = 8.517585754394531, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.666399002075195, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.3203558921813965, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.1614885330200195, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.1829118728637695, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.487157344818115, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.512290954589844, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 7.093459129333496, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 7.823711395263672, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 8.256770133972168, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 8.985453605651855, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 9.563492774963379, 油门 = 0, 方向 = -0.5, 刹车 = 1\n",
      "动作 = 3, 速度 = 9.752569198608398, 油门 = 0, 方向 = 0.5, 刹车 = 1\n",
      "动作 = 3, 速度 = 7.7662224769592285, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 5.915353775024414, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 5.9742655754089355, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.113770484924316, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.343883037567139, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.653626441955566, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.886728763580322, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 7.604276657104492, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 8.361978530883789, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 9.053543090820312, 油门 = 0, 方向 = -0.5, 刹车 = 1\n",
      "动作 = 1, 速度 = 9.100196838378906, 油门 = 0, 方向 = -0.5, 刹车 = 1\n",
      "动作 = 3, 速度 = 6.681776523590088, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 4.904655456542969, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 5.02065372467041, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 5.78840446472168, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.2451090812683105, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.458298206329346, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.752894878387451, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 7.526716232299805, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 8.217896461486816, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 8.671137809753418, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 9.267263412475586, 油门 = 0, 方向 = -0.5, 刹车 = 1\n",
      "动作 = 1, 速度 = 8.982979774475098, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 7.135485649108887, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 7.181661605834961, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.093262195587158, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.259135723114014, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 7.725098609924316, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 7.596404075622559, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 8.233813285827637, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 8.956192970275879, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 9.677756309509277, 油门 = 0, 方向 = -0.5, 刹车 = 1\n",
      "动作 = 1, 速度 = 9.727425575256348, 油门 = 0, 方向 = -0.5, 刹车 = 1\n",
      "动作 = 1, 速度 = 8.236412048339844, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.365002155303955, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.0029473304748535, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 5.940327167510986, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 5.914198875427246, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.177887916564941, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.088581562042236, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.878876686096191, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 7.70147180557251, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 8.311781883239746, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 9.003875732421875, 油门 = 0, 方向 = 0.5, 刹车 = 1\n",
      "动作 = 3, 速度 = 9.10743236541748, 油门 = 0, 方向 = 0.5, 刹车 = 1\n",
      "动作 = 3, 速度 = 6.689859867095947, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 4.6655120849609375, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 5.324864387512207, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 5.83915901184082, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.357274055480957, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.552618980407715, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.7774224281311035, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 7.4900946617126465, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 8.200270652770996, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 8.83409309387207, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 9.425328254699707, 油门 = 0, 方向 = -0.5, 刹车 = 1\n",
      "动作 = 1, 速度 = 9.165103912353516, 油门 = 0, 方向 = -0.5, 刹车 = 1\n",
      "动作 = 1, 速度 = 6.749327659606934, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 4.936593532562256, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 5.408723831176758, 油门 = 1, 方向 = 0.5, 刹车 = 0\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "动作 = 1, 速度 = 5.842231273651123, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.344825744628906, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.392443656921387, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.896473407745361, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 7.465142250061035, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 8.190281867980957, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 8.856317520141602, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 9.41474723815918, 油门 = 0, 方向 = -0.5, 刹车 = 1\n",
      "动作 = 3, 速度 = 9.179401397705078, 油门 = 0, 方向 = 0.5, 刹车 = 1\n",
      "动作 = 3, 速度 = 7.185281276702881, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 5.393190860748291, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 5.579018592834473, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.197734832763672, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.672431945800781, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.7019877433776855, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.225253582000732, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.968850135803223, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 8.543838500976562, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 9.165946006774902, 油门 = 0, 方向 = 0.5, 刹车 = 1\n",
      "动作 = 3, 速度 = 8.889962196350098, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.047008514404297, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.067893028259277, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.992447376251221, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 7.12934684753418, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 7.585793972015381, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.620129108428955, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 8.178848266601562, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 8.83933162689209, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 9.575170516967773, 油门 = 0, 方向 = 0.5, 刹车 = 1\n",
      "动作 = 3, 速度 = 9.760544776916504, 油门 = 0, 方向 = 0.5, 刹车 = 1\n",
      "动作 = 1, 速度 = 8.957843780517578, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.072393417358398, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.868803024291992, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.622467041015625, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.6375627517700195, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.65115213394165, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.801389217376709, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.120896339416504, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.779662132263184, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 8.492804527282715, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 9.086345672607422, 油门 = 0, 方向 = 0.5, 刹车 = 1\n",
      "动作 = 3, 速度 = 9.135178565979004, 油门 = 0, 方向 = 0.5, 刹车 = 1\n",
      "动作 = 1, 速度 = 7.207827091217041, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 5.538578510284424, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 5.5940117835998535, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 5.406905174255371, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 5.420875072479248, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 5.642271518707275, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 5.503739356994629, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.417138576507568, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.035862445831299, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 7.5385894775390625, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 8.189558982849121, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 8.852991104125977, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 9.448911666870117, 油门 = 0, 方向 = -0.5, 刹车 = 1\n",
      "动作 = 1, 速度 = 9.277376174926758, 油门 = 0, 方向 = -0.5, 刹车 = 1\n",
      "动作 = 1, 速度 = 6.822248458862305, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 5.062925815582275, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 5.499656677246094, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 5.7745819091796875, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.428913593292236, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.547778129577637, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.917960166931152, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 7.553201198577881, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 8.289020538330078, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 8.930898666381836, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 9.510200500488281, 油门 = 0, 方向 = -0.5, 刹车 = 1\n",
      "动作 = 3, 速度 = 9.654961585998535, 油门 = 0, 方向 = 0.5, 刹车 = 1\n",
      "动作 = 3, 速度 = 7.2511887550354, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 5.4208598136901855, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 5.833283424377441, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.221606731414795, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.584106922149658, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.691162586212158, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.219700813293457, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.756462097167969, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 8.492925643920898, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 9.03935432434082, 油门 = 0, 方向 = 0.5, 刹车 = 1\n",
      "动作 = 3, 速度 = 9.05890941619873, 油门 = 0, 方向 = 0.5, 刹车 = 1\n",
      "动作 = 1, 速度 = 6.615967273712158, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 4.916601657867432, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 5.005417823791504, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 5.7689032554626465, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.02048397064209, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.618343353271484, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.514808177947998, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.135487079620361, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.819139003753662, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 8.473937034606934, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 9.140765190124512, 油门 = 0, 方向 = 0.5, 刹车 = 1\n",
      "动作 = 3, 速度 = 8.90797233581543, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 7.070461273193359, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.994924545288086, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.46309232711792, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 7.856503009796143, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 8.30220890045166, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 8.367019653320312, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 8.85572624206543, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 9.480300903320312, 油门 = 0, 方向 = 0.5, 刹车 = 1\n",
      "动作 = 3, 速度 = 9.728672981262207, 油门 = 0, 方向 = 0.5, 刹车 = 1\n",
      "动作 = 1, 速度 = 8.631349563598633, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.628839015960693, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.402876853942871, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 7.002811908721924, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.782247543334961, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.4830498695373535, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.681051254272461, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 6.76820182800293, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.294376850128174, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 8.06904411315918, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 8.723608016967773, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 9.375661849975586, 油门 = 0, 方向 = -0.5, 刹车 = 1\n",
      "动作 = 1, 速度 = 9.36580753326416, 油门 = 0, 方向 = -0.5, 刹车 = 1\n",
      "动作 = 1, 速度 = 7.421483039855957, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 5.395778179168701, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.008969783782959, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.431161403656006, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 6.876626968383789, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 1, 速度 = 7.188015460968018, 油门 = 1, 方向 = -0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 7.376546859741211, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "动作 = 3, 速度 = 8.023926734924316, 油门 = 1, 方向 = 0.5, 刹车 = 0\n",
      "回合 从 2019-01-01 08:01:47.925642 到 2019-01-01 08:06:59.343107 结束. {'distance': 4.6839447021484375}\n"
     ]
    }
   ],
   "source": [
    "env = AirSimCarEnv()\n",
    "agent = DQNAgent(weight_path=weight_path, train_conv=train_conv,\n",
    "        random_inital_steps=random_inital_steps)\n",
    "\n",
    "if train:\n",
    "    print('开始训练')\n",
    "    while True: # 无限循环，永不停止。需要手动中断\n",
    "        try:\n",
    "            # 判断是否用随机动作填充经验库\n",
    "            random = agent.replayer.count < random_inital_steps\n",
    "\n",
    "            play_once(env, agent, explore_start=True, random=random,\n",
    "                    train=True, max_epoch_time=max_epoch_time)\n",
    "\n",
    "        # 极少数情况下 AirSim 会停止工作，需要重新启动并连接\n",
    "        except msgpackrpc.error.TimeoutError:\n",
    "            print('与 AirSim 连接中断。开始重新链接')\n",
    "            env.connect()\n",
    "else:\n",
    "    print('开始测试')\n",
    "    agent.epsilon = 0. # 取消探索\n",
    "    play_once(env, agent, max_epoch_time=max_epoch_time)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
